<?php
set_time_limit(300);
$cur_dir = 'topadmin';
$target_dir = '_topadmin\\';
//$cur_dir = $cur_dir.'\App\Lib';
echo '正在分析目录 &gt;'.$cur_dir;
flush();
function getAllPHPFile($cur_dir){
	echo '.';
	flush();
	static $encrypt_file_array = array();
	static $open_file_array = array();
	$dirs = scandir($cur_dir);
    foreach($dirs as $value){
		$value = $cur_dir.'\\'.$value;
	  if(preg_match ('/^\w.*/',basename($value)) && is_dir($value)){		
         getAllPHPFile($value);
	  }elseif( is_file($value) && preg_match ('/^\w.*.php/',basename($value))){	
		  $file_array[] = $value;
		  $content  = file_get_contents($value);
		  if(strpos($content,'$cryptCode=')){
             $encrypt_file_array[] = $value;
		  }else{
             $open_file_array[] = $value;
		  }
	  }
   }
   $file_array = array('encrypt'=>$encrypt_file_array,'open'=>$open_file_array);
   return $file_array;
}

$file_array = getAllPHPFile($cur_dir);
echo '<br/>分析完毕<br/>';
echo '共找到压缩的php文件 '.count($file_array['encrypt']).' 个<br/>';
echo '开始解压件...<br/>';
flush();
//
foreach($file_array['encrypt'] as $value){
	 echo '正在解压文件  '.$value.' <br/>';
	 make_dir($target_dir.dirname($value));

	 $open_source = decryptFile($value);
	 echo '&gt;&gt;&gt;生成文件 -&gt;  '.$target_dir.dirname($value).'/'.basename($value).' <br/>';
	 file_put_contents($target_dir.dirname($value).'\\'.basename($value),$open_source);
	 	 flush();
}
echo '完成';
echo '<pre>';
//print_r($file_array['encrypt']);
//print_r($file_array);''

//echo  $cur_dir;
/*
$file = 'ArticleAction.class.php';
$script_content = file_get_contents($file);

$start = strpos($script_content,'=')+2;

$end   = strpos($script_content,"eval");

$script_content = substr( $script_content , $start , $end-$start-2 );
echo $script_content;
echo '<hr/>';
$script_content = gzinflate(base64_decode($script_content));
echo $script_content;
file_put_contents('tttt.php', '<?php \n\t'.$script_content.' ?????');

*/

/**
* 对加密文件进行解密,返回解密的字符串
*/

function decryptFile($filePath){
      if(!is_file($filePath)){
	     return false;
	  }
	  $script_content = file_get_contents($filePath);
      $start = strpos($script_content,'\'');
	  $script_content=substr($script_content,$start+1);
      $script_content=substr($script_content,0,strpos($script_content,'\''));
	  $script_content = gzinflate(base64_decode($script_content));
      $target =  '<?php '.$script_content;
	  if(!strrpos($target,'?>')){
          $target .= '?>';
	  }
	  return trim($target);
}

//echo decryptFile('ArticleAction.class.php');
/**
 * 检查目标文件夹是否存在，如果不存在则自动创建该目录
 *
 * @access      public
 * @param       string      folder     目录路径。不能使用相对于网站根目录的URL
 *
 * @return      bool
 */
function make_dir($folder)
{
	$folder = str_replace('\\','/',$folder);

    $reval = false;

    if (!file_exists($folder))
    {
        /* 如果目录不存在则尝试创建该目录 */
        @umask(0);

        /* 将目录路径拆分成数组 */
        preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);

        /* 如果第一个字符为/则当作物理路径处理 */
        $base = ($atmp[0][0] == '/') ? '/' : '';

        /* 遍历包含路径信息的数组 */
        foreach ($atmp[1] AS $val)
        {
            if ('' != $val)
            {
                $base .= $val;

                if ('..' == $val || '.' == $val)
                {
                    /* 如果目录为.或者..则直接补/继续下一个循环 */
                    $base .= '/';

                    continue;
                }
            }
            else
            {
                continue;
            }

            $base .= '/';

            if (!file_exists($base))
            {
                /* 尝试创建目录，如果创建失败则继续循环 */
                if (@mkdir(rtrim($base, '/'), 0777))
                {
                    @chmod($base, 0777);
                    $reval = true;
                }
            }
        }
    }
    else
    {
        /* 路径已经存在。返回该路径是不是一个目录 */
        $reval = is_dir($folder);
    }

    clearstatcache();

    return $reval;
}
?>